package org.example.aigc.service;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.aigc.entity.Appearance;
import org.example.aigc.entity.Audio;
import org.example.aigc.entity.Course;
import org.example.aigc.entity.Student;
import org.example.aigc.utils.Reply;

import java.util.List;

public interface UserService {
    /**
     * 获取所有学生
     *
     * @return 学生对象列表
     */
    List<Student> getAllStudent();

    /**
     * 查找注册用户名是否重复
     *
     * @param username 注册用户名
     * @return 是否重复
     */
    int hasName(String username);

    /**
     * 用户注册信息
     *
     * @param request   请求变量
     * @param response  回复变量
     * @param username  用户名
     * @param password  密码
     * @param isStudent 是否为学生
     * @return 返回注册的状态
     */
    int register(HttpServletRequest request, HttpServletResponse response, String username, String password, Boolean isStudent);

    /**
     * 用户登录
     *
     * @param request  请求变量
     * @param response 回复变量
     * @param username 用户名
     * @param password 密码
     * @return 返回登录状态以及登录身份
     */
    Reply login(HttpServletRequest request, HttpServletResponse response, String username, String password);

    /**
     * 用户收藏课程
     *
     * @param request  请求变量
     * @param response 回复变量
     * @param courseId 课程 id
     * @return 返回收藏课程的执行状态
     */
    int favorite(HttpServletRequest request, HttpServletResponse response, Long courseId);

    /**
     * 用户取消收藏课程
     *
     * @param request  请求变量
     * @param response 回复变量
     * @param courseId 课程 id
     * @return 返回取消课程的执行状态
     */
    int unFavorite(HttpServletRequest request, HttpServletResponse response, Long courseId);

    /**
     * 查询用户收藏的课程
     *
     * @param request  请求变量
     * @param response 回复变量
     * @return 查询状态和收藏列表
     */
    List<Course> getFavorite(HttpServletRequest request, HttpServletResponse response);

    /**
     * 查询教师上传的课程
     *
     * @param request  请求变量
     * @param response 回复变量
     * @return 返回查询状态和课程列表
     */
    Reply getUploaded(HttpServletRequest request, HttpServletResponse response);

    /**
     * 用户创建声音模型
     *
     * @param request    请求变量
     * @param audioName  音频文件名
     * @param audioLabel 声音模型标签
     * @return 新建声音的 id
     */
    Reply uploadAudio(HttpServletRequest request, String audioName, String audioLabel);

    /**
     * 获取用户的声音模型列表
     *
     * @param request  请求变量
     * @param response 回复变量
     * @return 音频列表
     */
    List<Audio> getAudio(HttpServletRequest request, HttpServletResponse response);

    /**
     * 根据 audio_id 获取 audio 信息
     *
     * @param request  请求变量
     * @param response 回复变量
     * @param audioId  audio的id
     * @return 返回 audio 信息
     */
    Audio getAudioById(HttpServletRequest request, HttpServletResponse response, Long audioId);

    /**
     * 根据 appearance_id 获取 appearance 信息
     *
     * @param request      请求变量
     * @param response     回复变量
     * @param appearanceId appearance的id
     * @return 返回 appearance 信息
     */
    Appearance getAppearanceById(HttpServletRequest request, HttpServletResponse response, Long appearanceId);

    /**
     * 删除音频
     *
     * @param audioId 音频id
     * @return 删除状态
     */
    int deleteAudio(Long audioId);

    /**
     * 用户创建外形
     *
     * @param request         请求变量
     * @param appearanceName  外形文件名
     * @param appearanceLabel 外形标签
     * @param coverName       外形封面
     * @return 新建外形的 id
     */
    Reply uploadAppearance(HttpServletRequest request, String appearanceName, String appearanceLabel, String coverName);

    /**
     * 获取用户的外形模型列表
     *
     * @param request  请求变量
     * @param response 回复变量
     * @return 外形列表
     */
    List<Appearance> getAppearance(HttpServletRequest request, HttpServletResponse response);

    /**
     * 删除外形
     *
     * @param appearanceId 外形id
     * @return 删除状态
     */
    int deleteAppearance(Long appearanceId);
}
